package singleton

import "sync"

var (
	// 懒汉式
	// 3. 定义一个指针变量来存储创建好的实例
	instance *singleton
	// 4. 用于并发安全的锁，表示只能执行一次
	once sync.Once
	// 饿汉式
	//instance = &singleton{}
)

// singleton 1. 不带构造方法，将类型定义为包内私有类型
type singleton struct {
	Name string
}

// GetInstance 2. 定义一个方法来为客户端提供实例
func GetInstance() *singleton {
	// 5. go风格的单例模式
	once.Do(func() {
		instance = &singleton{
			Name: "singleton",
		}
	})
	// 传统方法，判断存储实例的指针是否有值，如果没有则创建类实例并赋值给指针
	// 同时这里还需要注意线程安全的问题，
	//if instance == nil {
	//	instance = &singleton{}
	//}
	return instance
}
